import { effect, track, trigger } from "./index.js";
function computed(getter, options = {}) {
  // value 用来缓存上一次计算的值
  let value;
  let dirty = true; // dirty 用来标记计算属性是否需要重新计算
  // 把getter函数包装成一个副作用函数
  const effectFn = effect(getter, {
    lazy: true,
    sheduler: () => {
      // 当依赖发生变化时,将dirty设置为true,表示需要重新计算
      dirty = true;
      // 当计算属性依赖的响应式数据变化时,手动调用trigger函数触发响应
      trigger(obj, "value");
    },
  });
  // 定义一个计算属性对象
  const obj = {
    // 当读取value时才执行effectFn
    get value() {
      if (dirty) {
        // 如果dirty为true,则需要重新计算
        value = effectFn();
        dirty = false; // 计算完成后将dirty设置为false
      }
      // 当读取value时,触发track函数,将当前副作用函数与计算属性关联起来
      // 这样可以确保当计算属性依赖的值发生变化时,计算属性会重新计算
      track(obj, "value");
      return value;
    },
  };

  return obj;
}

// 示例
const data = { foo: 1, bar: 2 };
const obj = new Proxy(data, {
  get(target, prop) {
    // 当读取属性时,触发副作用函数
    return target[prop];
  },
  set(target, prop, value) {
    // 当设置属性时,更新数据并触发副作用函数
    target[prop] = value;
    return true;
  },
});
const sum = computed(() => obj.foo + obj.bar);
console.log(sum.value); // 输出 3
